为什么a[2][1]结果会是9?

来源:百度知道 编辑:UC知道 时间:2024/06/19 04:17:14
#include <stdio.h>
void foo(int b[][3])
{
b++;
b[1][1]=9;
}
int main()
{
int a[][3]={{1,2,3},{4,5,6},{7,8,9}};
foo(a);
printf("%d,%d\n",a[1][2],a[2][1]);
}

原数组如此形式:
(指针指向)1 2 3
4 5 6
7 8 9
foo函数中b++,使得数组变为:
1 2 3
(指针指向)4 5 6
7 8 9
下一句,b[1][1]=9;使得8--->9;
所以通过foo函数处理,数组变为:
1 2 3
4 5 6
7 9 9
因此a[1][2]=6,a[2][1]=9;

b++会把指针移到第二行上,
这是b[1][1]实际上指向a[2][1]

void foo(int b[][3])
{
b++; /*函数参数中的数组其实不是数组,已经弱化为一个指针,b++会将指针移到第二行开始处*/
b[1][1]=9;
}

由于b++,使b首地址向前移动了一位,而此时,b[0][0]相当于a[1][0] ,此时,b[1][1]=9,又把9赋于了数组b[1][1],所以数组a[2][1]现在就成为9.写的不详细,希望你能看懂呀。

你的程序怎么可能通过编译?
b是一数组名,也就是数组的地址常量,是不允许赋值的。也就是说,上面写的b++,是错误的。

b是二维数组名,是一个指向行的地址,调用函数时将数组a的首地址传给b,b++是针对行的移动,运行完这一句后b指向原数组的第一行,就相当于重新给b赋了值,主函数中a[1][0]的地址是b的新的指向,所以b[0][0]==a[1][0],b[1][1]==a[2][1],所以b[1][1]=9相当于给a[2][1]重新赋值